Natan Felles


Creative Webmaster


Monitorando Tentativas de Acesso Proibido

Blog · seguranca

Monitorando Tentativas de Acesso Proibido

TCP Wrappers

Por padrão, muitos serviços executados em ambientes Unix-Like possuem portas pré-estabelecidas que podem ser vistas externamente por atacantes. Uma boa forma de iniciar com a segurança de um sistema é trabalhando através de TCP Wrappers, realização de filtragens de acesso.

O intuito deste artigo é mostrar como pode ser realizada uma configuração simples e de extrema utilidade para reforçar as camadas de segurança em um servidor. Editaremos quatro arquivos para que o sistema monitore quais hosts podem ou não acessar determinados serviços. Muito útil em ambientes de produção onde um servidor pode ter um IP Público acessível através da internet.

O Arquivo hostname

servidor.dominio.com

É nesse arquivo onde configura-se o nome do sistema, ele possui uma única linha e no exemplo acima o nome é servidor e este faz parte do dominio.com. Em alguns casos, pode haver apenas um nome, sem que o sistema pertença a nenhum domínio.

É possível mudar estas informações editando o arquivo hostname. Para que o sistema atualize o novo FQDN (Fully Qualified Domain Name) é preciso reiniciar o serviço:

service hostname restart

Teste para ver se o novo FQDN entrou em vigor com:

hostname -f

A saída deve ser identica ao nome inserido, nesse caso mostraria servidor.dominio.com.

O Arquivo hosts

/etc/hosts
127.0.0.1        localhost.localdomain   localhost
127.0.0.1        servidor.dominio.com    servidor
154.53.224.150   admin.dominio.com       admin

No arquivo hosts fica o endereçamento direto a nomes de domínios. No exemplo acima possuímos três linhas e cada uma com o IP, o FQDN e o nome do host respectivamente.

A primeira linha é padrão, ela diz que quando houver uma chamada por localhost ou localhost.localdomain o sistema deve dirigir-se ao IP 127.0.0.1, que é a própria máquina. Sabendo disso, você já consegue entender o que ocorre nas outras duas linhas.

No caso, 154.53.224.150 é o IP do local de onde o host admin acessará o sistema.

Através do arquivo hosts podemos impor para qual IP destina-se um domínio. Por exemplo: Se colocassemos o domínio google.com apontando para 127.0.0.1 o sistema entenderia que o site do Google está na máquina local. Isso é só um exemplo…

O Arquivo hosts.deny

/etc/hosts.deny
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#                  See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: some.host.name, .some.domain
#             ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
#
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
# ALL: PARANOID
ALL: ALL: twist /var/noaccess %h %d;
    /bin/echo -e "$(date) - O host %h tentou acessar o %d" >> /home/username/security.log;

Este arquivo já é muito bem explicado através dos comentários, sua função é negar o acesso a determinados serviços.

Nesse caso, adicionei as duas últimas linhas e elas farão com que todos os serviços sejam impedidos de serem acessados por todos os locais, ou seja ninguém poderá entrar no servidor e além disso utilizaremos o script /var/noaccess para escrever uma linha em um arquivo de log a cada vez que um host tentar acessar qualquer serviço. Abaixo, segue um exemplo de como ficaria:

Ter Fev  4 13:45:32 BRST 2016 - O host 103.235.46.69 tentou acessar o sshd

Dessa meneira você saberá, pelo menos, o IP final de um atacante. Dê ainda mais atenção se o serviço não estiver rodando em uma porta padrão pois pode estar sendo alvo de um exploit.

O Arquivo hosts.allow

/etc/hosts.allow
# /etc/hosts.allow: list of hosts that are allowed to access the system.
#                   See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: LOCAL @some_netgroup
#             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
ALL: 127.0.0.1
ALL: .dominio.com

Ao finalizar o arquivo anterior você deve ter ficado se peguntando; mas… se bloquearmos todos os acessos e ninguém poder entrar, também ficaremos trancados fora do servidor? Exatamente isso. Ninguém entra! Porém, existe o arquivo hosts.allow e nele configura-se quem pode acessar determinados serviços.

No exemplo acima, foram inseridas as duas últimas linhas e significam que todos os serviços são acessíveis para a própria máquina e para todos os hosts que pertençam ao dominio.com, não esqueça do ponto no início. Por isso, lá no arquivo hosts foi configurado o IP de acesso direto do admin e desta forma todos os serviços ficam acessíveis naquele IP (154.53.224.150).

Monitorando Tentativas de Acesso Proibido

tail -f /home/username/security.log

A execução do script /bin/echo através do arquivo hosts.deny só será executado quando houver uma tentativa de acesso não autorizado e desta forma o arquivo /home/username/security.log não existirá até que isso aconteça.

Uma boa forma de testar se tudo funcionará é utilizando o VirtualBox com um Servidor. Quando tentar entrar em algum serviço, por SSH, por exemplo, o arquivo de log será criado e uma nova linha inserida a cada tentativa de acesso proibido. Utilize o tail para deixar o terminal rodando e mostrando as informações do invasor.

Uhm, tá. Certo. Ultimamente eu tenho andado muito sonolento.
O que acha de me comprar um café? Comprar um café